package com.open.capacity.workflow.service;

import com.open.capacity.commons.PageResult;
import com.open.capacity.commons.Result;
import com.open.capacity.model.system.LoginAppUser;
import com.open.capacity.workflow.model.WFTask;

import java.util.List;
import java.util.Map;

/**
 * @author 作者 ftquan 464725602@qq.com
 * @version 创建时间：2017年11月12日 上午22:57:51
 */
public interface WFTaskService {

    /**
     * 保存流程任务
     *
     * @param task
     */
    void save(WFTask task);

    /**
     * 保存流程任务
     *
     * @param task
     */
    void save(WFTask task, String companyId, String departmentId);

    /**
     * 修改流程任务
     *
     * @param task
     */
    void update(WFTask task);


    /**
     * 更新任务状态
     *
     * @param id
     * @param status 状态 1 完成 2 关闭 3会签
     */
    void updateStatus(String id, Integer status, String userId, String userName);


    /**
     * 更新任务完成状态
     *
     * @param processId 流程实例主键
     * @param nodeId    节点主键
     * @param taskId    任务节点Id
     * @param userId    用户主键
     * @param userName  用户名称
     */
    void updateStatus(String processId, String nodeId, String taskId, String userId, String userName);


    /**
     * 删除流程任务
     *
     * @param id
     */
    void delete(String id);

    /**
     * 删除流程任务
     *
     * @param processId
     */
    void deleteByProcessId(String processId);

    /**
     * 删除流程任务(保留history)
     *
     * @param processId
     */
    void deleteByProcessIdNoHistory(String processId);


    /**
     * 删除流程结束，但分支没人处理的步骤
     *
     * @param processId
     */
    void deleteFinishedByUndoTaskByProcessId(String processId);


    /**
     * ID获取流程任务
     *
     * @param id
     * @return
     */
    WFTask findById(String id);


    /**
     * processId获取流程任务
     *
     * @param processId 流程实例id
     * @return
     */
    WFTask findUnFinishTasks(String processId, String nodeId);

    /**
     * processId获取流程任务
     *
     * @param processId 流程实例id
     * @return
     */
    List<WFTask> findUnFinishTasks(String processId);

    /**
     * processId获取流程任务
     *
     * @param processId 流程实例id
     * @return
     */
    List<WFTask> findTasksByProcessId(String processId);

    /**
     * processId获取流程任务
     *
     * @param code 流程实例code
     * @return
     */
    WFTask findTasksByProcessCode(String code);

    /**
     * processId nodeId获取流程任务
     *
     * @param processId 流程实例id
     * @param nodeId    节点id
     * @return
     */
    WFTask findTasksByProcessIdAndNodeId(String processId, String nodeId);

    /**
     * processId PreId获取流程任务
     *
     * @param processId      流程实例id
     * @param previousId 前置节点id
     * @return
     */
    List<WFTask> findTasksByProcessIdAndPreviousId(String processId, String previousId);

    /**
     * 分页查询流程任务
     *
     * @param params
     * @param user   当前用户信息
     * @return
     */
    PageResult<WFTask> pageTasks(Map<String, Object> params, LoginAppUser user);


    /**
     * 查询流程任务
     *
     * @param params
     * @param user   当前用户信息
     * @return
     */
    List<WFTask> findTasks(Map<String, Object> params, LoginAppUser user);


    /**
     * 更新流程任务
     *
     * @param task
     * @param keyValue key
     */
    Result saveOrUpdate(WFTask task, String keyValue);

}
